package com.cskaoyan.javase.thread._2api;

/**
 * 线程加入指的是Thread当中的join方法，它是一个成员方法，该方法完整声明如下：
 * public final void join() throws InterruptedException
 * 它的作用: 等待该线程终止。
 *
 * join方法执行后，需要一个线程等待另一个线程执行完毕后再执行，这里就需要搞清楚两个核心问题：
 *          1.谁等待？ 调用join方法位置的线程等待,ThreadA线程案例中,调用join方法的线程是主线程main
 *          2.等待谁？ 谁调用join方法就等待谁
 *
 *
 *
 *
 * @since 16:56
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class JoinDemo {
    public static void main(String[] args) throws InterruptedException {
        System.out.println(666666);
        ThreadA threadA = new ThreadA();
        threadA.start();
        // 调用join方法,它的作用是等待该线程执行完毕
        /*
             谁等待?
             join方法在主线线程当中被调用
             所以主线程等待
             等待谁呢?
             等待ThreadA线程执行完毕
        */
        threadA.join();
        System.out.println("hello world!");
        // threadA.join();
    }

    static class ThreadA extends Thread {
        @Override
        public void run() {
            ThreadB threadB = new ThreadB();
            threadB.start();
            try {
                /*
                    谁等待?
                    join方法在ThreadA线程当中被调用
                    所以ThreadA线程等待
                    等待谁呢?
                    等待ThreadB线程执行完毕
                 */
                threadB.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < 10; i++) {
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    static class ThreadB extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println("天亮之前说再见");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

